#include<iostream>
#include<unistd.h>
#include<signal.h>
#include<sys/types.h>
#include<sys/wait.h>
using namespace std;


void hander(int signalnum)
{
    cout<<"signal:"<<signalnum<<endl;
    sleep(2);
}

void showBlock(sigset_t *oset)
{
    int signo =1;
    for(;signo<=31;signo++)
    {
        if(sigismember(oset,signo))
        {
            cout<<"1";
        }
        else
        {
            cout<<"0";
        }
    }
    cout<<endl;
}



int main()
{
    //用户层面上设置
    sigset_t set,oset;
    sigemptyset(&set); //清空set里的信号
    sigemptyset(&oset);
    sigaddset(&set,2); //添加2号信号

    //设置进入进程，谁调用设置谁
    sigprocmask(SIG_SETMASK,&set,&oset); //修改block位图后，set信号2号信号无反应
    int cnt=0;
    while(true)
    {
        showBlock(&oset);
        sleep(1);

        cnt++;

        if(cnt==10)
        {
            cout<<"重置block表"<<endl;
            sigprocmask(SIG_SETMASK,&oset,&set);
            showBlock(&set);
        }





    }








    // pid_t id = fork();
    // if(id ==0)
    // {
    //     sleep(2);
    //     cout<<"替换SIGSEVGV方法"<<endl;
    //     int *p=nullptr;
    //     //p=10;    有些编译器可以编译过
    //     *p=10;
    //     cout<<"野指针问题"<<endl;
    //     exit(1);
    // }  

    
    // int status=0;
    // waitpid(id,&status,0);
    // cout<<"退出码:"<<((status>>8)&0xFF)<<endl;
    // cout<<"退出信号:"<<(status&0x7F)<<endl;
    // cout<<"dump码:"<<((status>>7 & 0x1))<<endl;






    // signal(SIGFPE,hander);//除0报错
    // int num=20;
    // num/=0;
    // cout<<"除0报错"<<endl;
    return 0;
}